sample\
08 sample_vpad-jujikey-noimg.hsp
#include "hsp3dish.as"
#include "mod_layerbutton.hsp"
#packopt xsize 480
#packopt ysize 800
screen 0,480,800
pxConL = 80 ; コントローラ表示位置の中心X座標
pyConL = ginfo_sy-90 ; コントローラ表示位置の中心Y座標
szConL = 1.0 ; コントローラのサイズ倍率
opConL = 0 ; タッチエリア範囲確認フラグ
gosub *create_jujiCon
pxConR = ginfo_sx-60
pyConR = ginfo_sy-70
szConR = 1.0
gosub *create_btnCon
repeat
redraw 0 : color 255,255,255 : boxf : color : pos 10,0 : font msgothic,17
mes "左を押したフレーム数: "+hidari
mes "上を押したフレーム数: "+ue
mes "右を押したフレーム数: "+migi
mes "下を押したフレーム数: "+shita
mes "Aを押したフレーム数: "+aaa
mes "Bを押したフレーム数: "+bbb
mes "メニューを押した回数: "+mmm
redraw 1
await 1000/60
loop
// 十字キー作成
*create_jujiCon
; 左
pos pxConL-(szConL*68), pyConL-(szConL*32)
layerbutton szConL*64,szConL*64, 0,0 {
laybtn_settings 0,4,1+4 ; 設定 : ボタン外からスライドしてもクリック + ボタンを押しても消さない
laybtn_hitarea 5, 0,0, szConL*32,szConL*-32, szConL*56,szConL*32, szConL*32,szConL*96, 0,szConL*64 ; ヒットエリア調整 : 斜め入力できるように
if lparam == objlayer_cmddraw {
gmode 3,,,150
switch (layerbtn_stat|1^1) ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
case LAYBTN_SHOW_IN : color 200,200,220 : swbreak
case LAYBTN_FOCUS_IN : color 190,175,230 : swbreak
case LAYBTN_PRESS_IN : color 250,190, 70 : swbreak
swend
boxfao 0,0, szConL*32,szConL*64, objlayer_axis_x, objlayer_axis_y
trianglefao szConL*32,0, szConL*64,szConL*32, szConL*32,szConL*64, objlayer_axis_x, objlayer_axis_y
if opConL { ; タッチエリア表示
arr = 0,0, int(szConL*32),int(szConL*-32), int(szConL*56),int(szConL*32), int(szConL*32),int(szConL*96), 0,int(szConL*64), 0,0
color ginfo_r-20,ginfo_g-20,ginfo_b-20 : lineArray arr,6, objlayer_axis_x,objlayer_axis_y
}
if layerbtn_stat == LAYBTN_PRESS_IN {
hidari++
}
}
return
}
; 上
pos pxConL-(szConL*32), pyConL-(szConL*68)
layerbutton szConL*64,szConL*64, 1,0 {
laybtn_settings 0,4,1+4 ; 設定 : ボタン外からスライドしてもクリック + ボタンを押しても消さない
laybtn_hitarea 5, 0,0, szConL*64,0, szConL*96,szConL*32, szConL*32,szConL*56, szConL*-32,szConL*32 ; ヒットエリア調整 : 斜め入力できるように
if lparam == objlayer_cmddraw {
gmode 3,,,150
switch (layerbtn_stat|1^1) ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
case LAYBTN_SHOW_IN : color 200,200,220 : swbreak
case LAYBTN_FOCUS_IN : color 190,175,230 : swbreak
case LAYBTN_PRESS_IN : color 250,190, 70 : swbreak
swend
boxfao 0,0, szConL*64,szConL*32, objlayer_axis_x, objlayer_axis_y
trianglefao szConL*64,szConL*32, szConL*32,szConL*64, 0,szConL*32, objlayer_axis_x, objlayer_axis_y
if opConL { ; タッチエリア表示
arr = 0,0, int(szConL*64),0, int(szConL*96),int(szConL*32), int(szConL*32),int(szConL*56), int(szConL*-32),int(szConL*32), 0,0
color ginfo_r-20,ginfo_g-20,ginfo_b-20 : lineArray arr,6, objlayer_axis_x,objlayer_axis_y
}
if layerbtn_stat == LAYBTN_PRESS_IN {
ue++
}
}
return
}
; 右
pos pxConL+(szConL*4), pyConL-(szConL*32)
layerbutton szConL*64,szConL*64, 2,0 {
laybtn_settings 0,4,1+4 ; 設定 : ボタン外からスライドしてもクリック + ボタンを押しても消さない
laybtn_hitarea 5, szConL*8,szConL*32, szConL*32,szConL*-32, szConL*64,0, szConL*64,szConL*64, szConL*32,szConL*96 ; ヒットエリア調整 : 斜め入力できるように
if lparam == objlayer_cmddraw {
gmode 3,,,150
switch (layerbtn_stat|1^1) ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
case LAYBTN_SHOW_IN : color 200,200,220 : swbreak
case LAYBTN_FOCUS_IN : color 190,175,230 : swbreak
case LAYBTN_PRESS_IN : color 250,190, 70 : swbreak
swend
boxfao szConL*32,0, szConL*64,szConL*64, objlayer_axis_x, objlayer_axis_y
trianglefao szConL*32,szConL*64, 0,szConL*32, szConL*32,0, objlayer_axis_x, objlayer_axis_y
if opConL { ; タッチエリア表示
arr = int(szConL*8),int(szConL*32), int(szConL*32),int(szConL*-32), int(szConL*64),0, int(szConL*64),int(szConL*64), int(szConL*32),int(szConL*96), int(szConL*8),int(szConL*32)
color ginfo_r-20,ginfo_g-20,ginfo_b-20 : lineArray arr,6, objlayer_axis_x,objlayer_axis_y
}
if layerbtn_stat == LAYBTN_PRESS_IN {
migi++
}
}
return
}
; 下
pos pxConL-(szConL*32), pyConL+(szConL*4)
layerbutton szConL*64,szConL*64, 3,1 {
laybtn_settings 0,4,1+4 ; 設定 : ボタン外からスライドしてもクリック + ボタンを押しても消さない
laybtn_hitarea 5, szConL*32,szConL*8, szConL*96,szConL*32, szConL*64,szConL*64, 0,szConL*64, szConL*-32,szConL*32 ; ヒットエリア調整 : 斜め入力できるように
if lparam == objlayer_cmddraw {
gmode 3,,,150
switch (layerbtn_stat|1^1) ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
case LAYBTN_SHOW_IN : color 200,200,220 : swbreak
case LAYBTN_FOCUS_IN : color 190,175,230 : swbreak
case LAYBTN_PRESS_IN : color 250,190, 70 : swbreak
swend
boxfao 0,szConL*32, szConL*64,szConL*64, objlayer_axis_x, objlayer_axis_y
trianglefao 0,szConL*32, szConL*32,0, szConL*64,szConL*32, objlayer_axis_x, objlayer_axis_y
if opConL { ; タッチエリア表示
arr = int(szConL*32),int(szConL*8), int(szConL*96),int(szConL*32), int(szConL*64),int(szConL*64), 0,int(szConL*64), int(szConL*-32),int(szConL*32), int(szConL*32),int(szConL*8)
color ginfo_r-20,ginfo_g-20,ginfo_b-20 : lineArray arr,6, objlayer_axis_x,objlayer_axis_y
}
if layerbtn_stat == LAYBTN_PRESS_IN {
shita++
}
}
return
}
return
// ボタン作成
*create_btnCon
; A
pos pxConR-(szConR*48), pyConR-(szConR*48)
layerbutton szConR*96,szConR*96, 0,1 {
laybtn_settings 0,4,1+4 ; 設定 : ボタン外からスライドしてもクリック + ボタンを押しても消さない
laybtn_hitarea -1, objlayer_size_x/2,objlayer_size_y/2, objlayer_size_x ; 円形ヒットエリア
if lparam == objlayer_cmddraw {
gmode 3,,,150
switch (layerbtn_stat|1^1) ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
case LAYBTN_SHOW_IN : color 200,200,220 : objcolor 200,200,220 : swbreak
case LAYBTN_FOCUS_IN : color 190,175,230 : objcolor 190,175,230 : swbreak
case LAYBTN_PRESS_IN : color 250,190, 70 : objcolor 250,190, 70 : swbreak
swend
circlefao objlayer_axis_x, objlayer_axis_y, objlayer_axis_x+objlayer_size_x, objlayer_axis_y+objlayer_size_y, 8
font msgothic,20,1 : laybtn_mes "A",4+16, 1,1
if layerbtn_stat == LAYBTN_PRESS_IN {
aaa++
}
}
return
}
; B
pos pxConR-(szConR*124), pyConR-(szConR*16)
layerbutton szConR*64,szConR*64, 1,1 {
laybtn_settings 0,4,1+4 ; 設定 : ボタン外からスライドしてもクリック + ボタンを押しても消さない
laybtn_hitarea -1, objlayer_size_x/2,objlayer_size_y/2, objlayer_size_x ; 円形ヒットエリア
if lparam == objlayer_cmddraw {
gmode 3,,,150
switch (layerbtn_stat|1^1) ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
case LAYBTN_SHOW_IN : color 200,200,220 : objcolor 200,200,220 : swbreak
case LAYBTN_FOCUS_IN : color 190,175,230 : objcolor 190,175,230 : swbreak
case LAYBTN_PRESS_IN : color 250,190, 70 : objcolor 250,190, 70 : swbreak
swend
circlefao objlayer_axis_x, objlayer_axis_y, objlayer_axis_x+objlayer_size_x, objlayer_axis_y+objlayer_size_y, 6
font msgothic,20,1 : laybtn_mes "B",4+16, 1,1
if layerbtn_stat == LAYBTN_PRESS_IN {
bbb++
}
}
return
}
; menu
pos pxConR+(szConR*-13), pyConR-(szConR*95)
layerbutton szConR*67,szConR*50, 2,1 {
laybtn_settings 0,0,5
laybtn_hitarea 6, szConR*2,szConR*34, szConR*10,szConR*1, szConR*42,szConR*6, szConR*65,szConR*19, szConR*55,szConR*51, szConR*33,szConR*39 ; ヒットエリア
if lparam == objlayer_cmddraw {
gmode 3,,,150
switch (layerbtn_stat|1^1) ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
case LAYBTN_SHOW_IN : color 200,200,220 : swbreak
case LAYBTN_FOCUS_IN : color 190,175,230 : swbreak
case LAYBTN_PRESS_IN : color 250,190, 70 : swbreak
swend
arr = szConR*6,szConR*35, szConR*3,szConR*31, szConR*9,szConR*4, szConR*12,szConR*2, szConR*42,szConR*6, szConR*62,szConR*17, szConR*64,szConR*21, szConR*56,szConR*47, szConR*52,szConR*49, szConR*33,szConR*39, szConR*6,szConR*35
lineArray arr,11, objlayer_axis_x,objlayer_axis_y
font msgothic,20,1 : laybtn_mes "≡",16, 1,1, 3,-1
if layerbtn_stat == LAYBTN_PRESS_IN_SELECTED {
laybtn_enable 0, 0 ; バーチャルパッドを操作無効にする
laybtn_enable 1, 0 ;
gosub *create_pausemenu ; ポーズメニュー画面の作成
mmm++
}
}
return
}
return
// ポーズメニュー画面作成
*create_pausemenu
; メニュー画面全体 (グループ:2)
pos 0,0
layerbutton ginfo_sx,ginfo_sy, 0,2 {
laybtn_settings 1,1,0 ; 設定 : キー/マウス操作無効
if lparam == objlayer_cmddraw {
font msgothic,20,1 : color 255,255,255
laybtn_ezbox $AA000000,$AA000000,$AA000000, "Pause Menu",0, 0,-150,,,0 ; 半透明黒で画面全体を覆う(角丸なし長方形)
}
return
}
; タッチエリア表示 (グループ:3)
pos 100, 370
layerbutton 320,40, 0,3 {
laybtn_settings 0,2,1 ; 設定 : 押しても消さない
if lparam == objlayer_cmddraw {
color 200,200,200
font msgothic,18,0 : laybtn_mes "十字キーのタッチエリア表示 : ",1, 0,1
gmode 3,,,256
switch (layerbtn_stat|1^1) ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
case LAYBTN_SHOW_IN : color 200,200,220 : swbreak
case LAYBTN_FOCUS_IN :
case LAYBTN_PRESS_IN : color 190,175,230 : swbreak ; FOCUSもPRESSも同じ色にする
swend
boxfao ginfo_cx,objlayer_axis_y, ginfo_cx+objlayer_size_y,objlayer_axis_y2 ; laybtn_mesで書いた文字の隣に描画
if layerbtn_stat == LAYBTN_PRESS_IN_SELECTED {
opConL = 1 - opConL ; タッチエリア表示オプションのON/OFF
}
if opConL {
font msgothic,20,1 : color : objcolor 0,0,0
pos ginfo_cx+10, : mes "レ",4 ; 簡易的にレ点でチェックマーク
}
}
return
}
; 閉じる (グループ:3)
pos 140, 470
layerbutton 200,40, 1,3 {
if lparam == objlayer_cmddraw {
font msgothic,20,1 : color
laybtn_ezbox $C8C8DC, $BEAFE6, $FABE46, "閉じる"
if layerbtn_stat & LAYBTN_COMPLETE {
laybtn_enable 0, 1 ; バーチャルパッドの操作を有効にする
laybtn_enable 1, 1
laybtn_hide 2 ; グループ2のオブジェクトを非表示処理 (閉じるボタン[グループ3]は押したら消える)
}
}
return
}
return
// 描画モジュール
#module
#deffunc lineArray array arr, int p1, int ox, int oy
pos ox+arr(0),oy+arr(1)
repeat limit(p1-1,0,length(arr)/2-1),1
line ox+arr(cnt*2),oy+arr(cnt*2+1)
loop
return
#deffunc boxfao int ax, int ay, int bx, int by, int ox, int oy
pdx=ax+ox,bx+ox,bx+ox,ax+ox
pdy=ay+oy,ay+oy,by+oy,by+oy
gsquare -1,pdx,pdy
return
#deffunc trianglefao int ax, int ay, int bx, int by, int cx, int cy, int ox, int oy
pdx=ax+ox,bx+ox,cx+ox,ax+ox
pdy=ay+oy,by+oy,cy+oy,ay+oy
gsquare -1,pdx,pdy
return
#deffunc quadfao int ax, int ay, int bx, int by, int cx, int cy, int dx, int dy, int ox, int oy
pdx=ax+ox,bx+ox,cx+ox,dx+ox
pdy=ay+oy,by+oy,cy+oy,dy+oy
gsquare -1,pdx,pdy
return
#deffunc circlefao int x1, int y1, int x2, int y2, int thick, int div, int ox, int oy
dcx = double(x1 + x2) / 2.0 + ox
dcy = double(y1 + y2) / 2.0 + oy
rx = absf(x2 - x1) / 2.0
ry = absf(y2 - y1) / 2.0
if rx < 1 || ry < 1 : return
div_ = div : if div_ <= 0 : div_ = limit((rx+ry)/4, 12, 128)
if thick == 1 {
repeat div_
ang1 = 2.0 * M_PI * cnt / div_
ang2 = 2.0 * M_PI * (cnt+1) / div_
x3 = dcx + cos(ang1) * rx
y3 = dcy + sin(ang1) * ry
x4 = dcx + cos(ang2) * rx
y4 = dcy + sin(ang2) * ry
trianglefao dcx, dcy, x3, y3, x4, y4
loop
return
}
thick_ = double(thick)
if thick_ < 1 : thick_ = 1.0
rx1 = rx - thick_/2.0
ry1 = ry - thick_/2.0
rx2 = rx + thick_/2.0
ry2 = ry + thick_/2.0
if rx1 < 0 : rx1 = 0
if ry1 < 0 : ry1 = 0
repeat div_
ang1 = 2.0 * M_PI * cnt / div_
ang2 = 2.0 * M_PI * (cnt+1) / div_
ox1 = dcx + cos(ang1) * rx2
oy1 = dcy + sin(ang1) * ry2
ox2 = dcx + cos(ang2) * rx2
oy2 = dcy + sin(ang2) * ry2
ix2 = dcx + cos(ang2) * rx1
iy2 = dcy + sin(ang2) * ry1
ix1 = dcx + cos(ang1) * rx1
iy1 = dcy + sin(ang1) * ry1
quadfao ox1,oy1, ox2,oy2, ix2,iy2, ix1,iy1
loop
return
#deffunc rboxfao int x1, int y1, int x2, int y2, int r, int div, int ox, int oy
div_ = div : if div_ <= 0 : div_ = limit(6+(r-5)*(12-6)/(25-5), 6,12)
boxfao x1+r, y1, x2-r, y2, ox,oy
boxfao x1, y1+r, x1+r, y2-r, ox,oy
boxfao x2-r, y1+r, x2, y2-r, ox,oy
repeat 4
if cnt=0 : cx=x1+r : cy=y1+r : ang0=180.0
if cnt=1 : cx=x2-r : cy=y1+r : ang0=270.0
if cnt=2 : cx=x2-r : cy=y2-r : ang0=0.0
if cnt=3 : cx=x1+r : cy=y2-r : ang0=90.0
repeat div_
ang1 = ang0 + 90.0 * cnt/div_
ang2 = ang0 + 90.0 * (cnt+1)/div_
x3 = cx + cos(ang1/180.0*M_PI)*r
y3 = cy + sin(ang1/180.0*M_PI)*r
x4 = cx + cos(ang2/180.0*M_PI)*r
y4 = cy + sin(ang2/180.0*M_PI)*r
trianglefao cx,cy, x3,y3, x4,y4, ox,oy
loop
loop
return
#deffunc rboxfao_auto int x1, int y1, int x2, int y2, int ox, int oy
w = abs(x2 - x1)
h = abs(y2 - y1)
r = (w+h)/40
if r > w/2 : r = w/2
if r > h/2 : r = h/2
if r < 1 : r = 1
rboxfao x1,y1,x2,y2, r,0, ox,oy
return
#global